package com.navi.loaddata.core.repository;


import com.navi.loaddata.core.etlException.ETLException;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.Collection;
import java.util.List;

public interface NaviRepository {

    /**
     * 获取EntityManager
     *
     * @return EntityManager
     */
    public EntityManager getEntityManager();

    public <T,ID>T get(Class<T> clazz, ID id);

    /**
     * 需要加锁的地方，必须在方法前声明事务注解@Transactional ,否则锁将不会成功
     * PS: 之前ICIM版本的库之所以不用@Transactional，是因为在AOP中开启了事务。
     * 这样做的坏处是，有些查询的业务是不需要事务的，全部开启反而降低了系统的效能
     *
     * @param id
     * @return
     */
    public <T,ID>T getWithLock(Class<T> clazz, ID id);

    public <T>T uniqueResult(Class<T> clazz, String hql);

    public <T>Query createQuery(Class<T> clazz, String hqlString);

    public <T>Query createNativeQuery(Class<T> clazz, String sqlString);

    public Query createNativeQuery(String sqlString);

    public long count(String countSql);

    public <T>List<T> find(Class<T> clazz, String hql);

    public <T>List<T> findBySql(Class<T> clazz, String sql);

    public List findBySQL(String sql);

    public List findBySQL(Boolean isString, String sql);

    public <T>List<T> list(Class<T> clazz, String hql, Object... params);

    /**
     * 需要加锁的地方，必须在方法前声明事务注解@Transactional ,否则锁将不会成功
     * PS: 之前icim版本的库之所以不用，是因为在AOP中开启了事务。
     * 这样做的坏处时，有些查询的业务是不需要事务的，全部开启反而降低了系统的效能
     *
     * @param hql
     * @param params
     * @return
     */
    public <T>List<T> listWithLock(Class<T> clazz, String hql, Object... params);


    public <T> void save(T object);

    public <T> void save(Collection<T> objectList);
    public <T> void saveAll(List<T> objectList);


    public <T> void update(T object);

    public <T> void update(Collection<T> objectList);

    public <T,ID> void delete(Class<T> clazz, ID id);

    public <T> void delete(T entity);

    public <T> void deleteSessionView() ;

    public <T> void delete(Collection<T> objectList);


}